<?php

require_once('../commons_utils.php');
require_once('constantes.php');

/**
 * Vérifie l'existence du cookie de nom $cookieName_[nomdomaine] où [nomdomaine] est le nom du domaine<br />
 * Si la vérification est un succès, le cookie est renouvelé avant de retourner true. Sinon, on retourne faux
 * @param string $cookieName le nom du cookie à créer.
 * @param $cookieLifeTime durée de vie en minutes du cookie
 * @param $idMariage Identifiant du mariage pour lequel on veut créer le cookie
 * return bool : true si le cookie existe et false autrement
 */
function verifyCookie($cookieName, $cookieLifeTime, $idMariage) {
	if (isset($_COOKIE[$cookieName.'_'.$_SERVER['SERVER_NAME']])) {
		$cookieVal = $_COOKIE[$cookieName.'_'.$_SERVER['SERVER_NAME']];
		
		$idMariageToUse = $idMariage;
		if (is_null($idMariageToUse)) {
			//Récupérer l'identifiant du mariage du cookie appplicatif
			$idMariageToUse = getIdMariage();
		}
		
		$expectedValue = null;
		if (!is_null($idMariageToUse)) {
			//Calcul de la valeur attendue du cookie à comparer avec la valeur obtenue
			$expectedValue = computeCookieValueAuth($cookieName, $idMariageToUse);
		}
		
		if ($cookieVal === $expectedValue) {
			//Les deux cookies sont égaux, on renouvelle le cookie avant de terminer
			createCookieAuth($cookieName, $cookieLifeTime, $idMariageToUse);
			return true;
		} else {
			//Les cookies ont des valeurs différentes, on retourne faux
			return false;
		}
	}
	return false;
}

/**
 * Crée le cookie de nom $cookieName pour une durée de vie de $cookieLifeTime minutes
 * @param $cookieName nom du cookie
 * @param $cookieLifeTime durée de vie en minutes du cookie
 * @param $idMariage Identifiant du mariage pour lequel on veut créer le cookie
 * @return bool : true si le cookie a été envoyé au navigateur sans garantie de création côté client / false autrement
 */
function createCookieAuth($cookieName, $cookieLifeTime, $idMariage=null) {
	$hashedVal = computeCookieValueAuth($cookieName, $idMariage);
	return setcookie($cookieName.'_'.$_SERVER['SERVER_NAME'], $hashedVal, time() + $cookieLifeTime*60);
}

/**
 * Retourne la valeur du cookie $cookieName
 * @param string $cookieName nom du cookie
 * @param $idMariage Identifiant du mariage pour lequel on veut créer le cookie
 * @return string : valeur du cookie
 */
function computeCookieValueAuth($cookieName, $idMariage) {
	$infosMariage = getInfosMariage($idMariage);
	if (is_null($infosMariage) || ($infosMariage[KEY_ID_MARIAGE] != $idMariage)) {
		throw new Exception("Les informations du mariage d'identifiant '$idMariage' n'ont pas été trouvées", ERR_NOT_ACCEPTABLE);
	}
	$finalName = $cookieName.'_'.$_SERVER['SERVER_NAME'];
	$separator = '::';
	$value = 'Le cookie du mariage de '.$infosMariage[NOM_CONJOINT1] . ' et '.$infosMariage[NOM_CONJOINT2];
	
	$val2Hash = $finalName . $separator . $value . $separator . COOKIE_ENCRYPT_KEY;
	$hashedVal = hash_hmac('sha256', $val2Hash, COOKIE_ENCRYPT_KEY);
	return $hashedVal;
}

/**
 * Détruit les cookies de la liste en paramètre
 * @param array $listCookieNames : liste des noms de cookie
 * @return boolean : true si au moins un cookie a été supprimé; false autrement
 */
function destroyCookie($listCookieNames) {
	$atLeastOneKilled = false;
	foreach ($listCookieNames as $cookieName) {
		if (isset($_COOKIE[$cookieName])) {
			setcookie($cookieName, null, 0);
			$atLeastOneKilled = true;
		}
	}
	return $atLeastOneKilled;
}

/************************************************************************
 * Fonction d'affichage des pages Html
*************************************************************************/

/**
 * Retourne le header des pages
 */
function getBodyHeader() {
	$idMariage = getIdMariage();
	$infosMariage = getInfosMariage($idMariage);
	$body = '<div id="pageTitle" class="bold alignCenter">';
	$existCookieAuth = isset($_COOKIE[COOKIE_AUTH_NAME.'_'.$_SERVER['SERVER_NAME']]);
	if ($existCookieAuth) {
		$body .= '<span id="deconnexion"><a href="/wedding/admin/lyndamarcel/?deconnexion=1">Déconnexion</a></span><p><br /></p>';
	}
	if (is_null($infosMariage) || !$existCookieAuth) {
		$body .= '<span>Bienvenue sur le site de gestion des mariages</span><p><br /></p>';
	} else {
		$body .= '<span>Bienvenue sur le site de gestion du mariage de '. $infosMariage[PRENOM_CONJOINT1] . ' et ' . $infosMariage[PRENOM_CONJOINT2] . '</span><p><br /></p>
					<span>J - '.getNbDayLeftFromNow($infosMariage[ANNEE_MARIAGE], $infosMariage[MOIS_MARIAGE], $infosMariage[JOUR_MARIAGE]).'</span>';
	}
	$body .= '</div>';
	return $body;
}

/**
 * Affiche les symboles de pagination en y mettant les liens hypertextes que quand le symbole ne pointe pas sur la page courante
 * @param $idOnglet id onglet à afficher
 * @param $pageCourante numéro de la page courante
 * @param $targetPage numéro de la page cible (du symbole)
 * @param $symbole symbole à afficher
 * @param perPage nombre d'invités par page
 * @return string
 */
function paginationManageLink($idOnglet, $pageCourante, $targetPage, $symbole, $perPage) {
	if ($pageCourante == $targetPage) {
		//Le lien pointe sur la page courante, on n'affiche pas de lien hypertexte
		return '';
	}
	return "<a class=\"pagination\" href=\"/wedding/admin/lyndamarcel/$idOnglet?page=$targetPage&perPage=$perPage\">$symbole</a>";
}


/************************************************************************
 * Fonction utilitaires
*************************************************************************/

/**
 * Retourne la valeur correspondante à l'index $idx dans le tableau $array.
 * Retourne null si $array n'est pas un tableau ou si l'index n'existe pas dans le
 * tableaa
 * @param $array tableau dont on veut extraire la valeur de l'index $idx
 * @param $idx index dont on veut extraire la valeur
 * @return null ou la valeur correspondante à l'index $idx dans le tableau $array
 */
function extracValueFromArray($array, $idx) {
	if (!is_array($array)) {
		return null;
	} elseif (!isset($array[$idx])) {
		return null;
	} else {
		return $array[$idx];
	}
}

/**
 * Retourne un tableau des valeurs de l'index $idx extrait des tableaux contenus dans $arrayOfArrays
 * Retourne un tableau vide si aucune valeur non nulle correspondant à l'index $idx n'a pu être extraite
 * @param $arrayOfArrays tableau de tableaux
 * @param $idx index dont on extrait les valeurs dans les tableaux du tableau des tableaux
 * @return array : tableau des valeurs de l'index $idx des tableaux du tableau $arrayOfArrays
 */
function extractValuesFromArray($arrayOfArrays, $idx) {
	$ret = array();
	foreach ($arrayOfArrays as $array) {
		$val = extracValueFromArray($array, $idx);
		if (!is_null($val)) {
			$ret[] = $val;
		}
	}
	return $ret;
}
